<?xml version="1.0" encoding="utf-8"?>
<!--
                                                                                     
 h       t     t                ::       /     /                     t             / 
 h       t     t                ::      //    //                     t            // 
 h     ttttt ttttt ppppp sssss         //    //  y   y       sssss ttttt         //  
 hhhh    t     t   p   p s            //    //   y   y       s       t          //   
 h  hh   t     t   ppppp sssss       //    //    yyyyy       sssss   t         //    
 h   h   t     t   p         s  ::   /     /         y  ..       s   t    ..   /     
 h   h   t     t   p     sssss  ::   /     /     yyyyy  ..   sssss   t    ..   /     
                                                                                     
	<https://y.st./>
	Copyright © 2017 Alex Yst <mailto:copyright@y.st>

	This program is free software: you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation, either version 3 of the License, or
	(at your option) any later version.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with this program. If not, see <https://www.gnu.org./licenses/>.
-->
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<base href="https://y.st./en/coursework/CS1103/Unit5.java.xhtml" />
		<title>Unit5.java &lt;https://y.st./en/coursework/CS1103/Unit5.java.xhtml&gt;</title>
		<link rel="icon" type="image/png" href="/link/CC_BY-SA_4.0/y.st./icon.png" />
		<link rel="stylesheet" type="text/css" href="/link/basic.css" />
		<link rel="stylesheet" type="text/css" href="/link/site-specific.css" />
		<script type="text/javascript" src="/script/javascript.js" />
		<meta name="viewport" content="width=device-width" />
	</head>
	<body>
		<nav>
			<p>
				<a href="/en/">Home</a> |
				<a href="/en/a/about.xhtml">About</a> |
				<a href="/en/a/contact.xhtml">Contact</a> |
				<a href="/a/canary.txt">Canary</a> |
				<a href="/en/URI_research/"><abbr title="Uniform Resource Identifier">URI</abbr> research</a> |
				<a href="/en/opinion/">Opinions</a> |
				<a href="/en/coursework/">Coursework</a> |
				<a href="/en/law/">Law</a> |
				<a href="/en/a/links.xhtml">Links</a> |
				<a href="/en/coursework/CS1103/Unit5.java.xhtml.asc">{this page}.asc</a>
			</p>
			<hr/>
			<p>
				<a href="/en/coursework/BUS1101/" title="Principles of Business Management">BUS 1101</a> |
				<span class="hyperlink_unavailable" title="Basic Accounting">BUS 1102</span> |
				<span class="hyperlink_unavailable" title="Principles of Marketing">BUS 2201</span> |
				<span class="hyperlink_unavailable" title="Multinational Management">BUS 2207</span> |
				<span class="hyperlink_unavailable" title="Business and Society">BUS 3306</span> |
				<a href="/en/coursework/CS1101/" title="Programming Fundamentals">CS 1101</a> |
				<a href="/en/coursework/CS1102/" title="Programming 1">CS 1102</a> |
				<a href="/en/coursework/CS1103/" title="Programming 2">CS 1103</a> |
				<span class="hyperlink_unavailable" title="Computer Systems">CS 1104</span> |
				<a href="/en/coursework/CS2203/" title="Databases 1">CS 2203</a> |
				<span class="hyperlink_unavailable" title="Communications and Networking">CS 2204</span> |
				<a href="/en/coursework/CS2205/" title="Web Programming 1">CS 2205</a> |
				<a href="/en/coursework/CS2301/" title="Operating Systems 1">CS 2301</a> |
				<span class="hyperlink_unavailable" title="Software Engineering 1">CS 2401</span> |
				<span class="hyperlink_unavailable" title="Data Structures">CS 3303</span> |
				<span class="hyperlink_unavailable" title="Analysis of Algorithms">CS 3304</span> |
				<span class="hyperlink_unavailable" title="Web Programming 2">CS 3305</span> |
				<span class="hyperlink_unavailable" title="Databases 2">CS 3306</span> |
				<span class="hyperlink_unavailable" title="Operating Systems 2">CS 3307</span> |
				<span class="hyperlink_unavailable" title="Information Retrieval">CS 3308</span> |
				<span class="hyperlink_unavailable" title="Comparative Programming Languages">CS 4402</span> |
				<span class="hyperlink_unavailable" title="Software Engineering 2">CS 4403</span> |
				<span class="hyperlink_unavailable" title="Advanced Networking and Data Security">CS 4404</span> |
				<span class="hyperlink_unavailable" title="Mobile Applications">CS 4405</span> |
				<span class="hyperlink_unavailable" title="Computer Graphics">CS 4406</span> |
				<span class="hyperlink_unavailable" title="Data Mining and Machine Learning">CS 4407</span> |
				<span class="hyperlink_unavailable" title="Artificial Intelligence">CS 4408</span> |
				<span class="hyperlink_unavailable" title="English Composition 2">ENGL 1102</span> |
				<span class="hyperlink_unavailable" title="World Literature">ENGL 1405</span> |
				<span class="hyperlink_unavailable" title="Introduction to Environmental Science">ENVS 1301</span> |
				<a href="/en/coursework/HIST1421/" title="Greek and Roman Civilization">HIST 1421</a> |
				<span class="hyperlink_unavailable" title="College Algebra">MATH 1201</span> |
				<span class="hyperlink_unavailable" title="Calculus">MATH 1211</span> |
				<span class="hyperlink_unavailable" title="Introduction to Statistics">MATH 1280</span> |
				<span class="hyperlink_unavailable" title="Discrete Mathematics">MATH 1302</span> |
				<span class="hyperlink_unavailable" title="Introduction to Philosophy">PHIL 1402</span> |
				<a href="/en/coursework/PHIL1404/" title="Ethics and Social Responsibility">PHIL 1404</a> |
				<a href="/en/coursework/POLS1503/" title="Globalization">POLS 1503</a> |
				<span class="hyperlink_unavailable" title="Introduction to Psychology">PSYC 1504</span> |
				<a href="/en/coursework/UNIV1001/" title="Online Education Strategies">UNIV 1001</a>
			</p>
			<hr/>
			<p>
				<a href="/en/coursework/CS1103/Unit1.java.xhtml" title="Unit1.java">Unit 1</a> |
				<a href="/en/coursework/CS1103/SimpleRandomSentences.java.xhtml" title="SimpleRandomSentences.java">Unit 2</a> |
				<a href="/en/coursework/CS1103/Tape.java.xhtml" title="Tape.java">Unit 3</a> |
				<a href="/en/coursework/CS1103/Debugging.xhtml" title="Debugging">Unit 4</a> |
				<a href="/en/coursework/CS1103/Unit5.java.xhtml" title="Unit5.java">Unit 5</a> |
				<a href="/en/coursework/CS1103/DrawTextPanel.java.xhtml" title="DrawTextPanel.java">Unit 6</a> |
				<a href="/en/coursework/CS1103/Unit7.java.xhtml" title="Unit7.java">Unit 7</a>
			</p>
			<hr/>
		</nav>
		<header>
			<h1>Unit5.java</h1>
			<p>Written in <span title="Programming 2">CS 1103</span> of <a href="http://www.uopeople.edu/">University of the People</a>, finalised on 2017-07-19</p>
		</header>
<h2>Source code</h2>
<blockquote>
<pre><code>/* 
 * Copyright (C) 2017 Alex Yst
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see &lt;http://www.gnu.org/licenses/&gt;.
 */
package st.y.CS1103.Unit5;

/**
 * Alex Yst&apos;s CS 1103 (Programming 2) Unit 5 submission
 * 
 * This program loads a dictionary file, then processes a second file and
 * checks it for misspellings.
 * 
 * @author Alex Yst
 */
public class Unit5 {
/**
 * The main method reads the dictionary file (which must be present in the
 * Eclipse project repository), then asks the user for a file. The user&apos;s file
 * is checked for spelling errors and a list of suggested spellings is output.
 * 
 * @param arguments Command line arguments are ignored.
 */
	public static void main(String[] arguments) {
		try {
			java.util.Scanner filein = new java.util.Scanner(new java.io.File(&quot;words.txt&quot;));
			java.util.HashSet&lt;String&gt; dict = new java.util.HashSet&lt;String&gt;();
			while (filein.hasNext()) {
				dict.add(filein.next().toLowerCase());
			}
			filein.close();
			System.out.print(&quot;Words included in the dictionary (should be 72875): &quot;);
			System.out.println(dict.size());
			filein = new java.util.Scanner(getInputFileNameFromUser());
			filein.useDelimiter(&quot;[^a-zA-Z]+&quot;);
			java.util.HashSet&lt;String&gt; misspelled = new java.util.HashSet&lt;String&gt;();
			while (filein.hasNext()) {
				String word = filein.next().toLowerCase();
				if(!dict.contains(word)) {
					if(!misspelled.contains(word)) {
						misspelled.add(word);
						System.out.print(word);
						System.out.print(&quot;: &quot;);
						java.util.TreeSet&lt;String&gt; corrections = corrections(word, dict);
						if(corrections.isEmpty()) {
							System.out.println(&quot;(no suggestions)&quot;);
						} else {
							java.util.Iterator&lt;String&gt; it = corrections.iterator();
							System.out.print(it.next());
							while(it.hasNext()) {
								System.out.print(&quot;, &quot;);
								System.out.print(it.next());
							}
							System.out.println();
						}
					}
				}
			}
			filein.close();
		} catch(java.io.FileNotFoundException e) {
			System.out.println(e.getMessage());
		} catch(NullPointerException e) {
			System.out.println(&quot;File not chosen; aborting.&quot;);
		}
		
	}
/**
 * Lets the user select an input file using a standard file
 * selection dialog box.  If the user cancels the dialog
 * without selecting a file, the return value is null.
 */
	static java.io.File getInputFileNameFromUser() {
		javax.swing.JFileChooser fileDialog = new javax.swing.JFileChooser();
		fileDialog.setDialogTitle(&quot;Select File for Input&quot;);
		int option = fileDialog.showOpenDialog(null);
		if (option != javax.swing.JFileChooser.APPROVE_OPTION) {
			return null;
		} else {
			return fileDialog.getSelectedFile();
		}
	}
/**
 * This method attempts to figure out what correctly-spelled word a misspelled
 * word was meant to be. A set of suggestions, if any can be found, are
 * returned.
 * 
 * @param badWord A word not present in the dictionary
 * @param dictionary The dictionary of valid words
 * @return A set of words the user may have meant to type
 */
	static java.util.TreeSet&lt;String&gt; corrections(String badWord, java.util.HashSet&lt;String&gt; dictionary) {
		java.util.TreeSet&lt;String&gt; set = new java.util.TreeSet&lt;String&gt;();
		for(int i=0;i&lt;badWord.length();i++) {
			String prefix = badWord.substring(0,i);
			String suffix = badWord.substring(i+1);
// Delete any one of the letters from the misspelled word.
			addWord(prefix+suffix, set, dictionary);
			for(char c=&apos;a&apos;;c&lt;=&apos;z&apos;;c++) {// C++? No, I think this is Java.
// Change any letter in the misspelled word to any other letter.
				addWord(prefix+c+suffix, set, dictionary);
			}
		}
		for(int i=0;i&lt;=badWord.length();i++) {
			String prefix = badWord.substring(0,i);
			String suffix = badWord.substring(i);
// Insert a space at any point in the misspelled word (and check that both of
// the words that are produced are in the dictionary)
			addWords(prefix, suffix, set, dictionary);
			for(char c=&apos;a&apos;;c&lt;=&apos;z&apos;;c++) {// C++? No, I think this is Java.
// Insert any letter at any point in the misspelled word.
				addWord(prefix+c+suffix, set, dictionary);
			}
		}
		for(int i=0;i&lt;badWord.length()-1;i++) {
			String prefix = badWord.substring(0,i);
			String letter0 = badWord.substring(i+1, i+2);
			String letter1 = badWord.substring(i, i+1);
			String suffix = badWord.substring(i+2);
// Swap any two neighbouring characters in the misspelled word.
			addWord(prefix+letter0+letter1+suffix, set, dictionary);
		}
		return set;
	}
/**
 * Checks a potential word for validity, then adds it to the list of suggested
 * spellings.
 * 
 * @param word The potential suggestion
 * @param set The set of suggestions found thus far
 * @param dictionary The dictionary of valid words
 */
	static public void addWord(String word, java.util.TreeSet&lt;String&gt; set, java.util.HashSet&lt;String&gt; dictionary) {
		if(dictionary.contains(word)) {
			set.add(word);
		}
	}
/**
 * Checks a pair of words for validity, then adds them to the list of suggested
 * spellings.
 * 
 * @param word0 The first word of the pair
 * @param word1 The second word of the pair
 * @param set The set of suggestions found thus far
 * @param dictionary The dictionary of valid words
 */
	static public void addWords(String word0, String word1, java.util.TreeSet&lt;String&gt; set, java.util.HashSet&lt;String&gt; dictionary) {
		if(dictionary.contains(word0) &amp;&amp; dictionary.contains(word1)) {
			set.add(word0+&apos; &apos;+word1);
		}
	}
}</code></pre>
</blockquote>
<h2>Output (when run on itself)</h2>
<blockquote>
<pre>Words included in the dictionary (should be 72875): 72875
c: a, ac, ca, cd, cf, ci, cl, cm, co, cr, cs, cu, kc, sc, tc
yst: cyst, myst, st, yest, yet
merchantability: merchant ability
http: (no suggestions)
www: wow
org: borg, erg, or, ora, orb, ore, orgy, orr
y: a, ay, by, my, ty, ya, yb, ye, yo
s: a, as, cs, es, gs, is, ks, ls, ms, os, rs, sb, sc, se, sh, si, sm, sn, so, sq, sr, st, ts, us, vs
param: pa ram, par am, pram
util: until
filein: file in
txt: tat, tet, text, tit, tot, tut
hashset: hash set
dict: dice, dick, dicta, diet, dint, dirt, duct, edict, pict
hasnext: has next
tolowercase: to lowercase
println: print ln
getinputfilenamefromuser: (no suggestions)
usedelimiter: use delimiter
za: a, ba, ca, fa, ga, ha, la, ma, na, pa, ra, ta, va, ya, zap, zn, zr
z: a, hz, oz, zn, zr
treeset: tree set
isempty: is empty
filenotfoundexception: (no suggestions)
e: a, be, ed, eh, em, er, es, eu, ex, fe, ge, he, le, me, ne, re, se, we, xe, ye
getmessage: get message
nullpointerexception: (no suggestions)
javax: java, javas
jfilechooser: (no suggestions)
filedialog: file dialog
setdialogtitle: (no suggestions)
int: ant, dint, hint, in, ina, inc, ind, ink, inn, ins, inti, into, it, lint, mint, nit, pint, tint
showopendialog: (no suggestions)
getselectedfile: (no suggestions)
badword: bad word
i: a, bi, ci, di, hi, id, if, in, io, ir, is, it, li, mi, ni, pi, si, ti
substring: sub string
addword: add word
addwords: add words
neighbouring: neighboring</pre>
</blockquote>
<p>
	<p>
		(It&apos;s worth noting that the word &quot;neighbouring&quot; is spelled correctly in English English (British English), but the dictionary we used for the assignment was in Statesian English, so the word got flagged as misspelled.
		As I actually did spell it right though, I didn&apos;t change the spelling in the comments.)
	</p>
</p>
		<hr/>
		<p>
			Copyright © 2017 Alex Yst;
			You may modify and/or redistribute this document under the terms of the <a rel="license" href="/license/gpl-3.0-standalone.xhtml"><abbr title="GNU&apos;s Not Unix">GNU</abbr> <abbr title="General Public License version Three or later">GPLv3+</abbr></a>.
			If for some reason you would prefer to modify and/or distribute this document under other free copyleft terms, please ask me via email.
			My address is in the source comments near the top of this document.
			This license also applies to embedded content such as images.
			For more information on that, see <a href="/en/a/licensing.xhtml">licensing</a>.
		</p>
		<p>
			<abbr title="World Wide Web Consortium">W3C</abbr> standards are important.
			This document conforms to the <a href="https://validator.w3.org./nu/?doc=https%3A%2F%2Fy.st.%2Fen%2Fcoursework%2FCS1103%2FUnit5.java.xhtml"><abbr title="Extensible Hypertext Markup Language">XHTML</abbr> 5.1</a> specification and uses style sheets that conform to the <a href="http://jigsaw.w3.org./css-validator/validator?uri=https%3A%2F%2Fy.st.%2Fen%2Fcoursework%2FCS1103%2FUnit5.java.xhtml"><abbr title="Cascading Style Sheets">CSS</abbr>3</a> specification.
		</p>
	</body>
</html>

